module(
    name = "pre-commit",
    version = "1.0.9",
    compatibility_level = 1,
)

bazel_dep(name = "platforms", version = "0.0.11")
bazel_dep(name = "bazel_skylib", version = "1.7.1")
bazel_dep(name = "rules_python", version = "1.0.0")
bazel_dep(name = "rules_license", version = "1.0.0")
bazel_dep(name = "rules_diff", version = "1.0.0")
bazel_dep(name = "toolchain_utils", version = "1.2.0")
bazel_dep(name = "download_utils", version = "1.0.1")
bazel_dep(name = "ape", version = "1.0.1")

# TODO: Remove this in favour of `rules_python//uv:lock.bzl` when released
bazel_dep(name = "rules_uv", version = "0.56.0", dev_dependency = True)
bazel_dep(name = "buildifier_prebuilt", version = "8.0.1", dev_dependency = True)
bazel_dep(name = "hermetic_cc_toolchain", version = "3.1.0", dev_dependency = True)

python = use_extension("@rules_python//python/extensions:python.bzl", "python")
python.toolchain(
    # TODO: remove this when `ignore_root_user_error` is hermetic
    # https://github.com/bazelbuild/rules_python/issues/2016
    ignore_root_user_error = True,
    python_version = "3.13",
)

pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip")

# Ensure there is a `pip` hub for each Python version
# The project performs a `select` to grab the correct packages for the executing Python
# This is important to provide Python package aliases downstream such as `//pre-commit:pkg`
[
    (
        pip.parse(
            experimental_index_url = "https://pypi.org/simple",
            hub_name = "pre-commit-{}".format(version),
            python_version = version,
            requirements_lock = "//pre-commit/requirements:lock.txt",
        ),
        pip.parse(
            experimental_index_url = "https://pypi.org/simple",
            hub_name = "pre-commit-hook-{}".format(version),
            python_version = version,
            requirements_by_platform = {
                "//pre-commit/hook/requirements:lock.txt": "linux_*,osx_*,windows_*",
            },
        ),
        pip.parse(
            experimental_index_url = "https://pypi.org/simple",
            hub_name = "pre-commit-config-{}".format(version),
            python_version = version,
            requirements_lock = "//pre-commit/config/requirements:lock.txt",
        ),
        use_repo(
            pip,
            "pre-commit-{}".format(version),
            "pre-commit-hook-{}".format(version),
            "pre-commit-config-{}".format(version),
        ),
    )
    # Keep this in sync with `//pre-commit/python:versions.bzl`
    # TODO: load from `//pre-commit/python:version.bzl` when possible
    for version in ("3.10", "3.11", "3.12", "3.13")
]

download_file = use_repo_rule("@download_utils//download/file:defs.bzl", "download_file")

download_archive = use_repo_rule("@download_utils//download/archive:defs.bzl", "download_archive")

# Bazelisk binaries
[
    download_file(
        name = "bazelisk-{}".format(name),
        executable = True,
        integrity = integrity,
        output = "bazelisk.exe" if ".exe" in suffix else "bazelisk",
        urls = ["https://github.com/bazelbuild/bazelisk/releases/download/v1.25.0/bazelisk-{}".format(suffix)],
    )
    for name, suffix, integrity in (
        ("amd64-linux", "linux-amd64", "sha256-/Y/f9BihdYiHUg+kLafmrjmu/HiM9ef3u422k00nn8Q="),
        ("arm64-linux", "linux-arm64", "sha256-TI2WbkCsLE78x/Glpczu8sCi8WuVfnkfp6hnzOMej8s="),
        ("amd64-macos", "darwin-amd64", "sha256-CvAZ7rZC+nB0RBnQKqMt9V5ueghBBdSfsmgBpmCqVtM="),
        ("arm64-macos", "darwin-arm64", "sha256-sT3YnG7NkJRMo1OfWixxWhj2m3RYh4xHGpAqjkgs60s="),
        ("amd64-windows", "windows-amd64.exe", "sha256-ZBo9/r1xdwNnX5EpF3NcRLRc9jAL/fuSRTfzz7/83ZI="),
        ("arm64-windows", "bazelisk-windows-arm64.exe", "sha256-4FYwZnOIMzRNHbFatBB9L2L4nkphZJ1SF/Bw0l8NyNc="),
    )
]

# Ruff binaries
[
    download_archive(
        name = "ruff-{}".format(name),
        integrity = integrity,
        strip_prefix = "ruff-{}".format(triplet) if ext != ".zip" else "",
        urls = ["https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-{}{}".format(triplet, ext)],
    )
    for name, triplet, ext, integrity in (
        ("amd64-linux", "x86_64-unknown-linux-musl", ".tar.gz", "sha256-8LfHpa5EZzCsERkEpQTLlnicwcgrmWa1W+3Yim0+wHc="),
        ("arm64-linux", "aarch64-unknown-linux-musl", ".tar.gz", "sha256-uUrZS8DPFKEqcl/PI4PtBHtTcGj0szvwgV6LrzXm7Fw="),
        ("amd64-macos", "x86_64-apple-darwin", ".tar.gz", "sha256-Kg/RLNZtIKiCypcBWe82HV85e5OKWrnXYZ3sDxUVL1M="),
        ("arm64-macos", "aarch64-apple-darwin", ".tar.gz", "sha256-8UQ35xOZ4UMCvfXOkQ49+avJoiP+D/XWsC6wg8Ofows="),
        ("amd64-windows", "x86_64-pc-windows-msvc", ".zip", "sha256-I2xp7VEKMwL0C14Owc3gzHU1FGzTdljm0xaMhelOMIo="),
        ("arm64-windows", "aarch64-pc-windows-msvc", ".zip", "sha256-ckodh0IeEldZ6bfbqxak0QNIks5BgKqvYePrvn5nr6I="),
    )
]
